package com.obelisco.modelo.data;

import java.util.Date;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import org.hibernate.validator.Email;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;

import com.obelisco.modelo.beans.OrientacionMenu;
import com.obelisco.modelo.beans.TipoMenu;
import com.obelisco.modelo.data.auxiliares.Archivo;
 
public class Usuario extends DataGenerica<Usuario> {

	public static final String CAMBIO_CLAVE_SI  = "S"; 
	public static final String CAMBIO_CLAVE_NO = "N";
	
	private String login;
	private String contrasena;
	private String nombreCompleto;
	private String descripcion;
	private Boolean deSistema = false;
	private Archivo foto = new Archivo();
	private Boolean conCorreo = true;
	private String direccionCorreo;
	private Date fechaCreacion;	
	private Long nivelPermiso;
	private String cambioClave = CAMBIO_CLAVE_NO;
	private String tipoMenu = TipoMenu.BARRA;
	private String orientacionMenu = OrientacionMenu.VERTICAL;
	private Properties perfil = new Properties();
	private Rol rol;
	private Set preferidos = new HashSet();
	private Set<Grupo> grupos = new HashSet<Grupo>();
	private CarpetaTransaccion funciones;	
	private Set<Transaccion> funcionesPreferidas = new HashSet<Transaccion>();

	public Usuario() {
		super(Usuario.class);
	}
	
	public Boolean isConCorreo() {
		return conCorreo;
	}

	public String getContrasena() {
		return contrasena;
	}

	public String getDescripcion() {
		return descripcion;
	}

	@Length(max=14,message="EL LOGIN {error.longitud}")
	@NotEmpty(message="{error.ingrese} EL LOGIN")
	public String getLogin() {
		return login;
	}

	@Length(max=250,message="EL NOMBRE COMPLETO {error.longitud}")
	@NotEmpty(message="{error.ingrese} EL NOMBRE COMPLETO")
	public String getNombreCompleto() {
		return nombreCompleto;
	}

	@Email(message="{error.email}")
	public String getDireccionCorreo() {
		return direccionCorreo;
	}

	public Properties getPerfil() {
		return perfil;
	}

	public Set getPreferidos() {
		return preferidos;
	}

	public Rol getRol() {
		return rol;
	}

	public void setRol(Rol rol) {
		this.rol = rol;
	}

	public void setPreferidos(Set<Transaccion> preferidos) {
		this.preferidos = preferidos;
	}

	public void setPerfil(Properties perfil) {
		this.perfil = perfil;
	}

	public void setNombreCompleto(String nombreCompleto) {
		this.nombreCompleto = nombreCompleto;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public void setDireccionCorreo(String direccionCorreo) {
		this.direccionCorreo = direccionCorreo;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public void setContrasena(String contrasena) {
		this.contrasena = contrasena;
	}

	public void setConCorreo(Boolean conCorreo) {
		this.conCorreo = conCorreo;
	}

	public Archivo getFoto() {
		return foto;
	}

	public void setFoto(Archivo foto) {
		if (foto != null) {
			this.foto = foto;
			this.foto.setNombre("foto.jpg");
			if (this.foto.getContenido().length > 0)
				this.foto.setTipo(Archivo.determinarTipo(foto.getContenido()));
			else {
				this.foto.setContenido(new byte[] {});
				this.foto.setTipo("");
			}
		} else
			this.foto = new Archivo();
	}
	
	public Set<Grupo> getGrupos() {
		return grupos;
	}

	public void setGrupos(Set<Grupo> grupos) {
		this.grupos = grupos;
	}

	public CarpetaTransaccion getFunciones() {
		return funciones;
	}

	public void setFunciones(CarpetaTransaccion funciones) {
		this.funciones = funciones;
	}

	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public Long getNivelPermiso() {
		return nivelPermiso;
	}

	public void setNivelPermiso(Long nivelPermiso) {
		this.nivelPermiso = nivelPermiso;
	}
	
	public Boolean getDeSistema() {
		return deSistema;
	}

	public void setDeSistema(Boolean deSistema) {
		this.deSistema = deSistema;
	}

	public String getCambioClave() {
		return cambioClave;
	}

	public void setCambioClave(String cambioClave) {
		this.cambioClave = cambioClave;
	}

	@NotNull(message="{error.seleccione} LA ORIENTACION DEL MENU.")
	public String getOrientacionMenu() {
		return orientacionMenu;
	}

	public void setOrientacionMenu(String orientacionMenu) {
		this.orientacionMenu = orientacionMenu;
	}

	@NotNull(message="{error.seleccione} EL TIPO DE MENU.")
	public String getTipoMenu() {
		return tipoMenu;
	}

	public void setTipoMenu(String tipoMenu) {
		this.tipoMenu = tipoMenu;
	}

	public Set<Transaccion> getFuncionesPreferidas() {
		return funcionesPreferidas;
	}

	public void setFuncionesPreferidas(Set<Transaccion> funcionesPreferidas) {
		this.funcionesPreferidas = funcionesPreferidas;
	}

	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + (login == null ? 0 : login.hashCode());
		return result;
	}

	@Override
	public String toString() {
		return getLogin() + " - " + getNombreCompleto();
	}

	@Override
	public boolean equals(Usuario usuario) {
		return usuario.login.equals(this.login);
	}
	
}
